
const cheerio = require("cheerio");
const request = require(process.cwd() + '/utils/request.js');
const getUserAgent = require(process.cwd() + '/utils/getUserAgent.js');
const fs = require('fs'); 
const { waitTimeout } = require(process.cwd() + '/utils/Tools.js')

// 配置-------------------
const CONFIG = {
	// 目录配置
	catalogue: {
		url: `https://www.xs7.com/shu/38112/`, // 地址
		delete: ``, // 删除选择器
		alink: `#list dt:nth-child(14)~dd a`, // 按钮选择器
	},
	// 章节
	chapter: {
		baseUrl: 'https://www.xs7.com', // 基础地址
		delete: '#content div', // 删除选择器
		content: '#content', // 内容选择器
	},
	// 输出文件地址
	filePath: __dirname + `/output/巫师世界.txt`
}

// 执行
setTimeout(() => {
	// 验证配置
	if(!checkConfig()) {
		return;
	}
	// 读取目录
	getCatalogue();
}, 10);

// 验证配置
function checkConfig() {
	let msg = '';
	if(!CONFIG.catalogue.url) {
		msg = '目录地址不能为空';
	} else if(!CONFIG.catalogue.alink) {
		msg = '目录章节选择器不能为空';
	} else if(!CONFIG.chapter.baseUrl) {
		msg = '章节基础地址不能为空';
	} else if(!CONFIG.chapter.content) {
		msg = '章节内容选择器不能为空';
	} else if(!CONFIG.filePath) {
		msg = '输出文件地址不能为空';
	}
	if(msg) {
		console.log(`-------配置错误：${msg}--------`)
	}
	return msg ? false : true;
}


// 读取目录
async function getCatalogue() {
	let reqParam = {
		url: CONFIG.catalogue.url,
		method: 'GET',
		headers: {
			'Accept': 'application/json, text/plain, */*',
			'User-Agent': getUserAgent(),
		},
		// gzip: true
	}
	let body = await request(reqParam);
	// console.log(body);

	let $ = cheerio.load(body);
	// 判断是否有需要删除的结点
	if (CONFIG.catalogue.delete) {
		$(CONFIG.catalogue.delete).remove();
	}

	// 书籍目录
	let catalogue = [];
	$(CONFIG.catalogue.alink).each((index, item) => {
		// if(index >= 50) {
		// 	return;
		// }
		let no = index+1;
		let text =  $(item).text();
		let arr = [];
		if(text.indexOf('章 ') != -1) {
			arr = text.split('章 ');
		} else {
			arr = text.split(' ');
		}
		let name = arr[arr.length-1];
		catalogue.push({
			href: $(item).attr('href'),
			text: $(item).text(),
			no: no,
			name: name
		})
		// console.log($(item).text())
	})
	// console.log($(CONFIG.catalogue.alink).length);
	// console.log(catalogue[0].text)
	// console.log(catalogue[0].href)

	// 读取章节
	getChapter(catalogue);
}

// 读取章节
async function getChapter(catalogue) {

	// 清空内容，并且如果文件不存在，将自动创建
	// fs.writeFileSync(CONFIG.filePath, ''); 

	for(let i = 50; i < catalogue.length; i++) {
		let oCate = catalogue[i];

		// 提示---
		console.log(`获取：${oCate.text}----------------------------`)
		let url = CONFIG.chapter.baseUrl+oCate.href;

		// 获取章节内容
		let content = await loopChapter(url);

    	// 显示
    	console.log(`字节数：${content.length}`);
    	if(content.length == 0) {
    		console.log(`错误----------------------`);
    		console.log(`章节：${oCate.text}`);
    		console.log(`地址：${url}`);
    		break;
    	}

    	// 处理内容为文本
    	const result = content
		  .replace(/<p>\s*/g, '\n')     // 将<p>及其后空格转换为换行
		  .replace(/\s*<\/p>/g, '')     // 移除</p>及其前导空格
		  .trim()                       // 移除首尾多余空行
		  .replace(/^\n+|\n+$/g, '');   // 确保开头结尾无空行

		// 保存到txt文本中
		let groupName = classifyChapter(oCate.text, catalogue.length);
		// 添加章节内容
		// fs.appendFileSync(CONFIG.filePath.replace('.txt', groupName+'.txt'), '-------------***-------------\n', 'utf8');
		fs.appendFileSync(CONFIG.filePath.replace('.txt', groupName+'.txt'), `章节编号：${oCate.no}\n`, 'utf8'); // \n 用于换行
		fs.appendFileSync(CONFIG.filePath.replace('.txt', groupName+'.txt'), `章节名：${oCate.name}\n`, 'utf8'); // \n 用于换行
		// 添加章节名
		fs.appendFileSync(CONFIG.filePath.replace('.txt', groupName+'.txt'), `${oCate.text}\n\n`, 'utf8'); // \n 用于换行
		// 添加章节内容
		fs.appendFileSync(CONFIG.filePath.replace('.txt', groupName+'.txt'), result + '\n\n\n', 'utf8');

		// // 保存到txt文本中
		// // 添加章节名
		// fs.appendFileSync(CONFIG.filePath, `章节编号：${oCate.no}\n`, 'utf8'); // \n 用于换行
		// fs.appendFileSync(CONFIG.filePath, `章节名：${oCate.name}\n`, 'utf8'); // \n 用于换行
		// // fs.appendFileSync(CONFIG.filePath, `${oCate.text}\n\n`, 'utf8'); // \n 用于换行
		// // 添加章节内容
		// fs.appendFileSync(CONFIG.filePath, result + '\n\n\n', 'utf8');

		await waitTimeout(1000);
	}
	console.log('-------结束---------')
}

// 循环获取章节，避免报错
async function loopChapter(url) {
	let content = '';
	let i = 1;
	while(i <= 20) {
		console.log(`第${i}次获取------`);
		try {
			let reqParam = {
				url: url,
				method: 'GET',
				headers: {
					'Accept': 'application/json, text/plain, */*',
					'User-Agent': getUserAgent(),
				},
				// gzip: true
			}
			let res = await request(reqParam);
			// console.log(res);

			let $ = cheerio.load(res);
			// 判断是否有需要删除的结点
			if (CONFIG.chapter.delete) {
				$(CONFIG.chapter.delete).remove();
			}
			// 删除A标签
			$('a').remove();

			// 内容
	    	content = $(CONFIG.chapter.content).html();
	    	if(content && content.length) {
	    		break;
	    	}
	    	i++;
	    	await waitTimeout(1000);
		} catch(err) {
			// console.log(err);
		}
	}
	return content;	
}

// 章节分割
function classifyChapter(chapterStr, maxChapter) {
  // 使用正则提取章节号
  const match = chapterStr.match(/第?(\d+)章? /);
  if (!match || !match[1]) {
    throw new Error("无效的章节格式");
  }

  const chapterNumber = parseInt(match[1], 10); // 转为数字用于计算

  const start = Math.floor((chapterNumber - 1) / 10) * 10 + 1;
  const end = start + 9;

  // 特殊处理最后一个区间的上限：maxChapter
  const finalEnd = maxChapter;
  const displayEnd = end > finalEnd ? finalEnd : end;

  // 格式化为三位数前缀
  const format = num => String(num).padStart(3, '0');

  return `${format(start)}-${format(displayEnd)}`;
}